package dominioDAO;

import hbt.HibernateDAO;
import hbt.HibernateUtil;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import util.gestorFecha;
import controlador.CPR;
import dominioEntity.CPRGanancia;
import dominioEntity.Cotizacion;
import dominioEntity.ItemCotizacion;
import dominioEntity.ItemListaPrecios;
import dominioEntity.ItemSolicitud;
import dominioEntity.Rodamiento;
import dominioEntity.SolicitudRodamientos;

public class CotizacionDAO {
	private static CotizacionDAO instancia ;
	private static SessionFactory sf;
	private static Session session;
	
	public static CotizacionDAO getInstancia() {
		if(instancia == null){
			instancia = new CotizacionDAO();
		} 
		return instancia;
	}
	public CotizacionDAO()
	{
		sf = HibernateUtil.getSessionFactory();
	}
	
	protected Session getSession(){
		if(session == null || !session.isOpen()){
			session = sf.openSession();
		}
		return session;
	}
	protected void closeSession()
	{
		if(session.isOpen())
		{
			session.close();
		}
	}
	

	public void cotizarSolicitudCliente(SolicitudRodamientos sr)
	{
		Cotizacion c = new Cotizacion();
		c.setCliente(sr.getCliente());
		c.setSolicitudRodamientos(sr);
		c.setIdCotizacion(sr.getOrdenCompraCliente());
		c.setFecha(gestorFecha.getFechaHoy());
		List <ItemCotizacion> itemsCotizacion = new ArrayList<ItemCotizacion>();
		
		//Calculo total  de Cotizacion
		float totalSinDescuento = 0;
		for(ItemSolicitud i :sr.getItemsSolicitud())
		{
			Rodamiento rod =null; 
			rod = RodamientoDAO.getInstancia().getRodamiento(i.getnSerie(), i.getSufijo(), i.getMarca(), i.getOrigen());
			
			//Busco rodamiento generico
			if(rod==null)
			{
				rod = RodamientoDAO.getInstancia().getRodamiento(i.getnSerie());
			}
			if(rod!=null)
			{
				ItemCotizacion item = new ItemCotizacion();
				item.setCantidad(i.getCantidad());
				item.setRodamiento(rod);				
				
				//Busco la lista de precio del proveedor mas barato
				ItemListaPrecios itemLista= CPR.getInstancia().CalcularPrecioRodamiento(rod);
				if(itemLista!=null)
				{
					float porcentajeGanancia = (1+((float)CPRGananciaDAO.getInstancia().getPorcentajeGananciaVigente().getPorcentajeGanancia())/100);
				item.setPrecio(itemLista.getPrecioVenta()*(porcentajeGanancia));
				item.setItemListaPrecio(itemLista);
				
				itemsCotizacion.add(item);			
				
				//Sumo para el total
				totalSinDescuento = totalSinDescuento+(item.getPrecio()*item.getCantidad());
				}
			}				
		}
		c.setItemsCotizacion(itemsCotizacion);
		
		c.setTotalSinDescuento(totalSinDescuento);
		c.setDescuentoPorc(c.getCliente().getDescuentos());
		c.setTotalConDescuento(c.getTotalSinDescuento()*(1-(c.getDescuentoPorc()/100)));
				
		this.grabarCotizacion(c);
		sr.setEstadoCotizada();
		SolicitudRodamientoDAO.getInstancia().grabarSolicitud(sr);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Cotizacion> getCotizacionesPendientes(String pendiente)
	{
		String query = "from Cotizacion c where c.estado=:estado ";
		return  (List<Cotizacion>) HibernateDAO.getInstancia().parametros(query, "estado", pendiente);
		
	}
	
	
	public Cotizacion buscarCotizacionPorSolicitud(SolicitudRodamientos sr)
	{
		String query = "select c from Cotizacion c join c.solicitudRodamientos sr where sr.id="+sr.getId();
		return  (Cotizacion) HibernateDAO.getInstancia().totalizador(query);
		
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Cotizacion> buscarCotizacion(String pendiente)
	{
		String query = "from Cotizacion c where c.estado=:estado ";
		return  (List<Cotizacion>) HibernateDAO.getInstancia().parametros(query, "estado", pendiente);
		
	}

	public ItemListaPrecios buscarItemListaPrecio(Integer id)
	{
		String query ="from Cotizacion c where item.id= "+id;					
		ItemListaPrecios i  = (ItemListaPrecios)HibernateDAO.getInstancia().totalizador(query);
		return i;
	}
	
	public ItemCotizacion buscarItemCotizacion(Integer nroCotizacion, Rodamiento rod, Integer cantidad)
	{
		String query ="select item from Cotizacion coti join coti.itemsCotizacion item join item.rodamiento rod "
				+ "where coti.id="+nroCotizacion
				+ " and item.cantidad>="+cantidad
				+ " and rod.nSerie=:nSerie and rod.prefijo=:prefijo and rod.sufijo=:sufijo";
		
		ItemCotizacion itemCotizacion = (ItemCotizacion) HibernateDAO.getInstancia().propiedades(query, rod);
		return itemCotizacion;
	}

	public void grabarCotizacion(Cotizacion coti) {
		
		Session s = sf.openSession();
		s.beginTransaction();
		s.merge(coti);
		s.flush();
		s.getTransaction().commit();
		s.close();

	}
	
}
